//
// Created by WenYF on 2016/11/3.
//

#include "util.h"

int if_str_indexof(char *data, int len, char c){
    int i;
    for (i = 0; i < len; i++) {
        if (data[i] == c) {
            return i;
        }
    }

    return NOT_FOUND_POSITION;
}

int if_str_cpy(char *dst, char *src) {
    if (!src || !dst) {
		if (!src) {
			dst = NULL;
		}
        return 0;
    } else {
        int i;
        for (i = 0; *src; i++) {
            *dst = *src;
            src++;
            dst++;
        }

        *dst = '\0';
        return i;
    }
}

char* if_str_clone(char *src) {
    if(src) {
        char *cln = (char*) malloc (sizeof(char) * (if_str_len(src) + 1));
        if_str_cpy(cln, src);
        return cln;
    }
    return NULL;
}


int if_str_cmp(char *src, char *dst) {
    if (!src || !dst) {
        return -1;
    } else {
        int i = 0;
        while (*src == *dst && *src !='\0' && *dst !='\0') {
            src++;
            dst++;
            i++;
        }

        if (*src =='\0' && *dst == '\0') {
            return 0;
        }

        return 1;
    }
}

int if_str_len(char *src) {
    if (!src) {
        return 0;
    } else {
        char *p = src;
        while (*src) {
            src++;
        }

        return (int) (src - p);
    }
}

int if_str_cpy_x(char *dst, int len, char *src) {
    if (!src || !dst || len == 0) {
		if (!src || len == 0) {
			dst = NULL;
		}
        return 0;
    } else {
        int i;
        for (i = 0; i < len && *src; i++) {
            *dst = *src;
            src++;
            dst++;
        }

        *dst = '\0';
        return i;
    }
}

byte* if_intToByteArray(int a) {
    byte *b = (byte*) malloc (sizeof(byte) * 4);
    b[0] = (byte) ((a >> 24) & 0xFF);
    b[1] = (byte) ((a >> 16) & 0xFF);
    b[2] = (byte) ((a >> 8) & 0xFF);
    b[3] = (byte) (a & 0xFF);
    return b;
}
byte* if_shortToByteArray(short a) {
    byte *b = (byte*) malloc (sizeof(byte) * 2);
    b[0] = (byte) ((a >> 8) & 0xFF);
    b[1] = (byte) (a & 0xFF);
    return b;
}


int if_rand_int() {
	int ret = 0;
    srand(time(0));
    ret = rand() * 159453;
    return ret;
}

char* if_str_cat(char *dst, char *str) {
    return strcat(dst, str);
}

void if_printHex(byte *data, int length) {
    if (!data || length < 0) {
        return;
    } else {
        int i;
        char dst[256 * 1024] = {0};
        char tmp[4] = {0};
        for (i = 0; i < length; i++) {
            if (i == 0) {
                sprintf(tmp, "%02x", data[i]);
                if_str_cat(dst, tmp);
            } else if (i % 16 == 0) {
                sprintf(tmp, "\n%x", data[i]);
                if_str_cat(dst, tmp);
            } else {
                sprintf(tmp, " %02x", data[i]);
                if_str_cat(dst, tmp);
            }
        }
        logD("%s", dst);
    }
}

void if_quick_encrypt(byte *data, int length, byte cryptKey) {
    int i;
    for (i = 0; i < length; i++) {
        data[i] = (byte) (data[i] ^ cryptKey);
    }
}
void if_quick_encrypt_x(byte *data, int start, int offset, byte cryptKey) {
    int i;
    for (i = start; i < offset + start; i++) {
        data[i] = (byte) (data[i] ^ cryptKey);
    }
}
void if_quick_decrypt(byte *data, int length, byte cryptKey) {
    int i;
    for (i = 0; i < length; i++) {
        data[i] = (byte) (data[i] ^ cryptKey);
    }
}
void if_quick_decrypt_x(byte* data, int start, int offset, byte cryptKey) {
    int i;
    for (i = start; i < offset + start; i++) {
        data[i] = (byte) (data[i] ^ cryptKey);
    }
}

int if_str_multy(char* str) {
	int sum = 1;
	char ch;
	for (;ch = *str;str++) {
		sum *= ch;
	}

	return sum;
}
